import axios from 'axios'
import { useUserStore } from '@/stores/user'
import router from '@/router'

// 创建axios实例
const request = axios.create({
  baseURL: 'http://localhost:8000',
  timeout: 10000
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 从localStorage获取token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    const res = response.data
    console.log('[响应拦截器] 原始响应数据:', res)
    console.log('[响应拦截器] res.code:', res.code)
    console.log('[响应拦截器] res.success:', res.success)
    console.log('[响应拦截器] res.appid:', res.appid)
    console.log('[响应拦截器] res.goto:', res.goto ? res.goto.substring(0, 100) + '...' : '无')
    
    // 钉钉登录接口特殊处理：确保appid和goto字段都被正确返回
    if (res.appid || res.goto) {
      console.log('[响应拦截器] ✓ 检测到钉钉登录接口响应，包含appid或goto字段')
      console.log('[响应拦截器] appid值:', res.appid || '缺失')
      console.log('[响应拦截器] appid类型:', typeof res.appid)
      console.log('[响应拦截器] appid长度:', res.appid ? res.appid.length : 0)
      console.log('[响应拦截器] goto值:', res.goto ? res.goto.substring(0, 100) + '...' : '缺失')
      
      // 警告：如果检测到钉钉登录响应但appid缺失，这是严重问题
      if (!res.appid || res.appid.trim() === '') {
        console.error('[响应拦截器] ✗ 严重警告：钉钉登录响应缺少appid字段！')
        console.error('[响应拦截器] 完整响应数据:', JSON.stringify(res, null, 2))
        console.error('[响应拦截器] 响应所有键:', Object.keys(res))
      } else {
        console.log('[响应拦截器] ✓ appid验证通过:', res.appid)
      }
      
      // 直接返回，不进行任何修改，确保所有字段都被保留
      return res
    }
    
    // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
    if (res.code === 200) {
      console.log('[响应拦截器] 匹配格式: code=200')
      return res
    } else if (res.success === true) {
      // 钉钉登录接口返回格式：{"data": "...", "success": true} 或 {"goto": "...", "appid": "...", "success": true}
      console.log('[响应拦截器] 匹配格式: success=true')
      console.log('[响应拦截器] 检查字段 - appid:', res.appid || '无', 'goto:', res.goto ? '有' : '无')
      return res
    } else if (res.login_url || res.data) {
      // 钉钉登录接口可能返回 {login_url: "..."} 或 {data: "..."}
      console.log('[响应拦截器] 匹配格式: 包含login_url/data')
      return res
    } else if (!res.code && !res.success) {
      // 如果没有code或success字段，说明是直接返回数据的接口（如Django的JsonResponse），直接返回
      console.log('[响应拦截器] 匹配格式: 无code和success，直接返回')
      return res
    } else {
      // 其他状态码，提示错误信息
      console.log('[响应拦截器] 未匹配任何格式，返回错误')
      return Promise.reject(new Error(res.message || '请求失败'))
    }
  },
  error => {
    // 请求失败的处理
    if (error.response) {
      // 服务器返回了错误状态码
      const responseData = error.response.data || {}
      let message = responseData.message || `请求失败 (${error.response.status})`
      
      // 处理token失效的情况（401未授权、403 forbidden等）
      if (error.response.status === 401 || error.response.status === 403) {
        // 清除token和用户信息
        const userStore = useUserStore()
        userStore.clearUserInfo()
        
        // 如果当前不在登录页，跳转到登录页
        const currentPath = router.currentRoute.value.path
        if (currentPath !== '/login' && currentPath !== '/ding' && currentPath !== '/login-success') {
          router.replace('/login')
        }
        
        message = '登录已过期，请重新登录'
      }
      
      // 特殊处理：钉钉登录接口返回的错误
      if (error.response.config?.url?.includes('dingtalk') || error.response.config?.url?.includes('login-url')) {
        // 检查是否是APP_KEY未配置的错误
        if (responseData.error === 'APP_KEY未配置' || responseData.error === 'APP_KEY未配置') {
          message = '应用配置错误：APP_KEY未配置，请联系管理员配置钉钉应用信息'
        } else if (responseData.error) {
          message = responseData.error
        }
        
        // 如果响应中包含appid字段但为空，说明配置有问题
        if (responseData.success === false && !responseData.appid) {
          message = '应用配置错误：无法获取应用ID，请检查后端配置'
        }
      }
      
      return Promise.reject(new Error(message))
    } else if (error.request) {
      // 请求已发出但没有收到响应（网络错误或服务器未启动）
      return Promise.reject(new Error('无法连接到服务器，请确保后端服务已启动（端口8000）'))
    } else {
      // 其他错误
      return Promise.reject(error)
    }
  }
)

// 登录接口
export const login = (data) => {
  return request({
    url: '/login/',
    method: 'post',
    data
  })
}

// 发送验证码接口
export const sendVerifyCode = (data) => {
  return request({
    url: '/send_code/',
    method: 'post',
    data
  })
}

// 验证码登录接口
export const codeLogin = (data) => {
  return request({
    url: '/code_login/',
    method: 'post',
    data
  })
}

// 钉钉登录接口 - 返回钉钉appid和回调地址，供DTFrameLogin组件使用
// 根据钉钉官方规范，回调地址应该与前端域名一致，且在钉钉开放平台配置中登记
export const getDingTalkLoginUrl = () => {
  // 钉钉应用配置（与后端settings.py中的配置保持一致）
  const APP_KEY = 'dinggwwrjpslthefuf8u'
  // 回调地址（redirect_uri），必须与前端域名一致，指向 /login-success 页面
  // 钉钉扫码后会回调到此地址，携带 code 参数，然后前端通过 postMessage 或直接调用后端接口处理
  const REDIRECT_URI = 'http://localhost:5173/login-success'
  
  // 返回appid和回调地址，符合钉钉官方DTFrameLogin组件规范
  return Promise.resolve({
    success: true,
    appid: APP_KEY,
    redirect_uri: REDIRECT_URI
  })
}

// 配置另一个axios实例用于home相关API
// 注意：如果后端和前端不在同一域名，需要在vite.config.js中配置proxy代理
const api = axios.create({
  baseURL: '/api/home/', // 使用代理路径，实际指向 http://localhost:8000/home/
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// api的请求拦截器
api.interceptors.request.use(
  config => {
    // 从localStorage获取token并添加到请求头
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// api的响应拦截器
api.interceptors.response.use(
  response => {
    const res = response.data
    // 如果返回的状态码为200，说明接口请求成功
    if (res.code === 200) {
      return res
    } else if (res.code === 500 || res.code === 400) {
      // 服务器返回错误，提取错误信息
      const errorMessage = res.message || '服务器内部错误'
      return Promise.reject(new Error(errorMessage))
    } else if (!res.code) {
      // 如果没有code字段，可能是直接返回数据的接口，直接返回
      return res
    } else {
      // 其他状态码，返回错误信息
      return Promise.reject(new Error(res.message || '请求失败'))
    }
  },
  error => {
    // 请求失败的处理
    if (error.response) {
      // 服务器返回了错误状态码
      const responseData = error.response.data || {}
      let message = responseData.message || `请求失败 (${error.response.status})`
      
      // 如果是500错误，提取服务器返回的错误信息
      if (error.response.status === 500) {
        if (responseData.message) {
          message = responseData.message
        } else if (responseData.error) {
          message = responseData.error
        } else {
          message = '服务器内部错误，请稍后重试'
        }
      }
      
      return Promise.reject(new Error(message))
    } else if (error.request) {
      // 请求已发出但没有收到响应（网络错误或服务器未启动）
      return Promise.reject(new Error('无法连接到服务器，请确保后端服务已启动（端口8000）'))
    } else {
      // 其他错误
      return Promise.reject(error)
    }
  }
)

// API接口
export const homeAPI = {
  // 获取职位类型列表
  getPositionType(params = {}) {
    return api.get('positiontype/', { params })
  }
}

// 移除未使用的默认导出，避免代码警告
// export default request